package Juego.EntidadesVarias;

import Juego.ElementoJuego.ElementoJuego;
import Juego.ElementoJuego.Enemigo.Enemigo;
import Juego.ElementoJuego.Mario.Personaje;
import Juego.Nivel.Nivel;

/**
 * Clase que modela la gravedad que afecta al personaje
 * 
 * @author Mamani Natalia
 * @author Sanhueza Eduardo
 */

public class Gravedad extends Thread {
	
	protected Personaje mario;
	protected Nivel nivel;

	public Gravedad(Personaje mario, Nivel nivel) {
		this.mario = mario;
		this.nivel = nivel;
	}

	public void run() {
		while( mario.getVidas() > 0 ) {
			if(estaEnElAire())
				caer();
			
		}
	}
	
	public void iniciarGravedad(){
		start();
	}
	
	@SuppressWarnings("deprecation")
	public void detenerHilo(){
		if(isAlive())
			stop();
	}
	
	private void caer() {
		int posy = mario.getPos().getY();
		mario.getPos().setY(posy-1);
		enemigoDebajo();
		
		try {
			Thread.sleep(50);
		} 
		catch (InterruptedException e) {
		}
	}
	
	private void enemigoDebajo(){
		if(nivel.enemigosActivos().size() > 0){
			
			int posx = mario.getPos().getX();
			int posy = mario.getPos().getY()-1;
			int contador = 0;
			
			Enemigo enemigo;
			
			while(contador < nivel.enemigosActivos().size()){
				enemigo = nivel.enemigosActivos().get(contador);
				if(enemigo.getPos().getY() == posy && (enemigo.getPos().getX() == posx || 
													   enemigo.getPos().getX() == posx-1 ||
													   enemigo.getPos().getX() == posx+1)){
						if(enemigo.getVidas() == 1)
							nivel.enemigosActivos().remove(enemigo);
						
						enemigo.colision(nivel.getMario());	
					}
				else
					contador++;
			}
		}
	}

	
	public boolean estaEnElAire(){
		boolean estaEnElAire = false;
		ElementoJuego elementoInferior;
		if ( mario.getPos().getY() > 0 ){
			elementoInferior = nivel.get(mario.getPos().getX(),mario.getPos().getY()-1);
			
			if ( elementoInferior.esTransitable() ){
				estaEnElAire = true;
			}
		}
		return estaEnElAire;
	}
}